<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

                    <h4>UDP编程</h4>
                    <div class="x-wiki-info"><span>572次阅读</span></div>
                    <hr style="border-top-color:#ccc" />
                    <div class="x-wiki-content x-content"><p>TCP是建立可靠连接，并且通信双方都可以以流的形式发送数据。相对TCP，UDP则是面向无连接的协议。</p>
<p>使用UDP协议时，不需要建立连接，只需要知道对方的IP地址和端口号，就可以直接发数据包。但是，能不能到达就不知道了。</p>
<p>虽然用UDP传输数据不可靠，但它的优点是和TCP比，速度快，对于不要求可靠到达的数据，就可以使用UDP协议。</p>
<p>我们来看看如何通过UDP协议传输数据。和TCP类似，使用UDP的通信双方也分为客户端和服务器。服务器首先需要绑定端口：</p>
<pre><code>s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind((&#39;127.0.0.1&#39;, 9999))
</code></pre><p>创建Socket时，<code>SOCK_DGRAM</code>指定了这个Socket的类型是UDP。绑定端口和TCP一样，但是不需要调用<code>listen()</code>方法，而是直接接收来自任何客户端的数据：</p>
<pre><code>print &#39;Bind UDP on 9999...&#39;
while True:
    # 接收数据:
    data, addr = s.recvfrom(1024)
    print &#39;Received from %s:%s.&#39; % addr
    s.sendto(&#39;Hello, %s!&#39; % data, addr)
</code></pre><p><code>recvfrom()</code>方法返回数据和客户端的地址与端口，这样，服务器收到数据后，直接调用<code>sendto()</code>就可以把数据用UDP发给客户端。</p>
<p>注意这里省掉了多线程，因为这个例子很简单。</p>
<p>客户端使用UDP时，首先仍然创建基于UDP的Socket，然后，不需要调用<code>connect()</code>，直接通过<code>sendto()</code>给服务器发数据：</p>
<pre><code>s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [&#39;Michael&#39;, &#39;Tracy&#39;, &#39;Sarah&#39;]:
    # 发送数据:
    s.sendto(data, (&#39;127.0.0.1&#39;, 9999))
    # 接收数据:
    print s.recv(1024)
s.close()
</code></pre><p>从服务器接收数据仍然调用<code>recv()</code>方法。</p>
<p>仍然用两个命令行分别启动服务器和客户端测试，结果如下：</p>
<p><img src="http://www.liaoxuefeng.com/files/attachments/001410430396036690e72578d74495aa5482a1579c841af000" alt="client-server"></p>
<h3 id="-">小结</h3>
<p>UDP的使用与TCP类似，但是不需要建立连接。此外，服务器绑定UDP端口和TCP端口互不冲突，也就是说，UDP的9999端口与TCP的9999端口可以各自绑定。</p>
<p>源码参考：<a href="https://github.com/michaelliao/learn-python/tree/master/socket">https://github.com/michaelliao/learn-python/tree/master/socket</a></p>
</div>

                    <hr style="border-top-color:#ccc" />

                    